//策略模式(Strategy Pattern)
/**
 * 
 策略模式（Strategy Pattern）是一种软件设计模式，它定义了一系列算法，将每个算法封装起来并使它们可以互相替换。策略模式使得算法可以独立于使用它们的客户端而变化。它属于行为型设计模式。

在策略模式中，我们将具体的算法封装在不同的策略类中，这些策略类实现了一个共同的接口或抽象类。然后，
我们在客户端中使用一个上下文类，通过接口或抽象类与具体的策略类进行交互。在运行时，根据实际需求，
可以动态地改变策略类。

策略模式的优点包括：  
策略类之间可以自由切换，增加、删除或更换一个策略类对客户端代码没有任何影响，提高了代码的灵活性。
策略模式将算法的定义与使用分离，避免了大量的条件语句。
策略模式可以提供不同的算法实现，让客户端可以选择合适的算法。
策略模式在实际开发中的应用场景包括：

当一个系统需要动态地在几种算法中选择一种时，可以使用策略模式。
当一个对象有很多的行为，而且这些行为在不同的场景下有不同的实现时，可以考虑使用策略模式。
当一个类中有很多条件语句，而这些条件语句的目的是为了在不同的情况下执行不同的操作时，可以使用策略模式。
总之，策略模式可以帮助我们将算法的定义与使用分离，提高代码的灵活性和可维护性。
 * */ 
class Context{
	constructor(){
		this.argsObj={};
	} 
	setStrategy(args){
		this.argsObj=args;
	} 
	execute(x,y){
		//执行策略的方法
		return this.argsObj.operation(x,y)
	}
}

class Add{
	operation(x,y){
		console.log("执行Add策略");
		return x+y;
	}
}

class Substract{  
	operation(x,y){
		console.log("执行Substract策略");
		return x-y;
	}
}

let ct=new Context();
ct.setStrategy(new Add())
let rs=ct.execute(5,6)

console.log(rs);
ct.setStrategy(new Substract()) 
let rss=ct.execute(9,6)
console.log(rss);

/**
 *  B. 策略模式的优缺 
	优：符合开闭原则，灵活更换或添加算法，避免多重条件转移 
	缺：产生多个策略类；调用端需要了解所有类略类
	
	C. 策略模式的适用环境 
	系统中出现复杂多重判断；一系列算法行为需要相互替换；系统中有很多类，区别仅在于行为差异。
 * **/